<template>
  <div class="image-container"  style="padding-bottom: 20px;">
    <el-card class="box-card">
      <div slot="header" class="clearfix">
       <my-breadcrumb>素材管理</my-breadcrumb>
      </div>
      <div style="padding-bottom: 20px;">
        <el-radio-group v-model="isCollected" size="small" @change="hSwitchCollect">
          <el-radio-button :label="false">全部</el-radio-button>
          <el-radio-button :label="true">收藏</el-radio-button>
        </el-radio-group>
        <el-button
         @click="dialogVisible=true"
         type="success" size="mini" style="float:right"
         >上传图片素材 </el-button>
     </div>
      <!-- 素材列表 -->
      <!-- gutter--???????????????????????????????????? -->
      <el-row :gutter="10">
        <el-col
          class="img_item"
          :span="4"
          v-for="img in images"
          :key="img.id">
          <el-image
            style="height: 180px;width: 180px"
            :src="img.url"
            fit="cover" >
          </el-image>
          <!-- option只在全部 选项卡中才会出现，而在收藏选项卡中，不可见 -->
          <div class="option" v-if="!isCollected">
            <!-- 点击收藏高亮 动态类名-->
            <span class="el-icon-star-off" :class="{'red':img.is_collected}"
              @click="hToggleCollect(img)"
            ></span>
            <span @click="hDelImage(img)"
             class="el-icon-delete"></span>
          </div >
        </el-col>
      </el-row>
      <!-- 分页 -->
      <el-pagination
        style="margin-top:20px;"
        :disabled='isLoading'
        background
        layout="prev, pager, next"
        :page-size="10"
        @current-change="hPageChange"
        :total="total_count">
      </el-pagination>
  </el-card>
  <!-- 上传素材-弹层-对话框
    append-to-body: 把这个对话框挂载到body上，这样确保它显示在最前面 -->
    <el-dialog
      append-to-body
      title="上传图片" :visible.sync="dialogVisible">
    <!-- 弹出层 -->
    <!--
    - action：必选参数，上传的地址：http://ttapi.research.itcast.cn/mp/v1_0/user/images
    - headers: 设置上传的请求头部。要携带token
    - name：上传的文件字段名。要与接口中要求保持一致。
    - show-file-list： 是否显示已上传文件列表
    - on-success：文件上传成功时的钩子。`function(response, file, fileList)`
    - before-upload: 上传之前对文件进行检测。
    -->
    <el-upload
      class="avatar-uploader"
      action="http://api-toutiao-web.itheima.net/mp/v1_0/user/images"
      :headers="headers"
      name="image"
      :show-file-list="false"
      :on-success="handleAvatarSuccess"
      :before-upload="beforeAvatarUpload">
      <!--  - 当你设置图片的src时，浏览器会去请求图片的资源，当图片请求回来之后
          会一有一个事件触发出来，这个事件就是load -->
      <img v-if="imageUrl" :src="imageUrl" class="avatar" @load="hLoadUploadImage">
      <i v-else class="el-icon-plus avatar-uploader-icon"></i>
    </el-upload>
     </el-dialog>
  </div>
</template>

<script>
export default {
  name: 'ImageIndex',
  data () {
    return {
      //  请求头
      headers: {
        // 获取token
        Authorization: `Bearer ${localStorage.getItem('tokenStr')}`
      },
      dialogVisible: false, // 是否显示弹出对话框
      isCollected: false, // 按钮选中状态 false是选中
      isLoading: false, // 是否是收藏的图片
      total_count: 0, // 分页条数
      page: 1,
      imageUrl: '', // 图片预览地址
      images: [] // 图片列表
    }
  },
  created () {
    this.loadImages()
  },
  methods: {
    // 获取参数
    buildParam () {
      const paramsObj = {
        collect: this.isCollected, // 是否是收藏的图片
        page: this.page, // 页码
        per_page: 10 // 一页10条
      }
      return paramsObj
    },
    // 发送请求
    async loadImages () {
      const paramsObj = this.buildParam()
      try {
        const res = await this.$axios({
          method: 'get',
          url: '/mp/v1_0/user/images',
          params: paramsObj
        })
        console.log(res)
        this.images = res.data.data.results
        this.total_count = res.data.data.total_count
      } catch (err) {
        console.log(err)
        this.images = []
        this.total_count = 0
        this.$message.error('获取图片失败')
      }
    },
    //  点击分页事件
    hPageChange (curPage) {
      // 更新页面
      this.page = curPage
      // 重新渲染页面
      this.loadImages()
    },
    // 切换收藏全部事件筛选提交事件
    hSwitchCollect () {
      console.log(this.isCollected) // 是否是收藏的图片
      // 更新页码
      this.page = 1
      // 发送请求
      this.loadImages()
    },
    handleAvatarSuccess (res, file) {
      // 1.上传成功 预览图片
      console.log(res, file)
      // 给一个临时的url
      this.imageUrl = URL.createObjectURL(file.raw)
      // this.imageUrl = res.data.data.url
      // 重新获取数据
      this.loadImages()
    },
    beforeAvatarUpload (file) {
      const isJPG = file.type === 'image/jpeg'
      const isLt2M = file.size / 1024 / 1024 < 2

      if (!isJPG) {
        this.$message.error('上传头像图片只能是 JPG 格式!')
      }
      if (!isLt2M) {
        this.$message.error('上传头像图片大小不能超过 2MB!')
      }
      return isJPG && isLt2M
    },
    hLoadUploadImage () {
      // 上传成功后把弹窗关闭   把路径设置为空
      setTimeout(() => {
        this.imageUrl = ''
        this.dialogVisible = false
      }, 2000)
    },
    // 切换收藏状态
    async hToggleCollect (img) {
      try {
        const res = await this.$axios({
          method: 'PUT',
          url: '/mp/v1_0/user/images/' + img.id,
          data: {
          //  对当前选中的状态取反
            collect: !img.is_collected
          }
        })
        console.log(res)
        // 第一种方式 重新请求数据
        // this.loadImages()
        // 第二种方式 只改变本地的数据
        img.is_collected = !img.is_collected
        this.$message.success('操作成功')
      } catch (err) {
        console.log(err)
        this.$message.error('操作失败')
      }
    },
    // 用户删除图片
    async doDelete (id) {
      try {
        const res = await this.$axios({
          method: 'DELETE',
          url: '/mp/v1_0/user/images/' + id
        })
        console.log(res)
        this.$message.success('删除成功')
        // 方法1:重新请求刷新页面
        this.loadImages()
        // 方法2： 本地删除。这样会这当前页的数据越来越少，体验不好。
      } catch (err) {
        console.log(err)
        this.$message.error('删除失败')
      }
    },
    // 具体实现删除
    hDelImage (img) {
      this.$confirm('你确定删除吗').then(() => {
        // 确认删除获取id
        this.doDelete(img.id)
        console.log(img)
      }).catch(() => {
      // 取消删除
      })
    }
  }
}

</script>

<style lang="less" scoped>
.img_item {
  position: relative;
  box-sizing: border-box;
}
.option {
  position: absolute;
  // left: 5px;
  width:180px;
  bottom: 3px;
  height: 30px;
  line-height: 30px;
  background: rgba(0, 0, 0, 0.3);
  text-align: center;
  color: #fff;
  span {
    margin: 0 30px;
    cursor: pointer;
  }
}
.avatar-uploader {
  text-align: center;
}
.avatar-uploader-icon {
  font-size: 28px;
  color: #8c939d;
  width: 178px;
  height: 178px;
  line-height: 178px;
  text-align: center;
}
.avatar-uploader /deep/ .el-upload {
  border: 1px dashed #d9d9d9;
  border-radius: 6px;
  cursor: pointer;
  position: relative;
  overflow: hidden;
}
.red {
   color: red;
}
.avatar {
  width: 178px;
  height: 178px;
  display: block;
}
</style>
